#ifndef QTSCANNER_H
#define QTSCANNER_H

#include <QDialog>
#include <QListWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QProgressBar>
#include <QThread>
#include <QDir>
#include <QFileInfo>
#include <QStandardPaths>
#include <QSettings>

QT_BEGIN_NAMESPACE
class QListWidget;
class QPushButton;
class QVBoxLayout;
class QHBoxLayout;
class QLabel;
class QProgressBar;
QT_END_NAMESPACE

/**
 * Qt扫描工作线程类
 * 负责在后台扫描系统中的Qt安装
 */
class QtScanWorker : public QThread
{
    Q_OBJECT

public:
    explicit QtScanWorker(QObject *parent = nullptr);
    
protected:
    void run() override;
    
signals:
    /**
     * 发现Qt安装时发出信号
     * @param qtPath Qt安装路径
     * @param version Qt版本信息
     * @param compiler 编译器信息
     */
    void qtFound(const QString &qtPath, const QString &version, const QString &compiler);
    
    /**
     * 扫描完成信号
     */
    void scanFinished();
    
private:
    /**
     * 扫描指定目录下的Qt安装
     * @param baseDir 基础目录
     */
    void scanDirectory(const QString &baseDir);
    
    /**
     * 验证是否为有效的Qt安装目录
     * @param qtPath Qt路径
     * @return 是否有效
     */
    bool isValidQtInstallation(const QString &qtPath);
    
    /**
     * 获取Qt版本信息
     * @param qtPath Qt路径
     * @return 版本字符串
     */
    QString getQtVersion(const QString &qtPath);
    
    /**
     * 获取编译器信息
     * @param qtPath Qt路径
     * @return 编译器字符串
     */
    QString getCompilerInfo(const QString &qtPath);
};

/**
 * Qt扫描器对话框类
 * 提供Qt安装扫描和选择功能
 */
class QtScanner : public QDialog
{
    Q_OBJECT

public:
    explicit QtScanner(QWidget *parent = nullptr);
    ~QtScanner();
    
    /**
     * 获取选中的Qt路径
     * @return 选中的Qt路径，如果未选择则返回空字符串
     */
    QString getSelectedQtPath() const;
    
public slots:
    /**
     * 开始扫描Qt安装
     */
    void startScan();
    
private slots:
    /**
     * 处理发现的Qt安装
     * @param qtPath Qt路径
     * @param version 版本信息
     * @param compiler 编译器信息
     */
    void onQtFound(const QString &qtPath, const QString &version, const QString &compiler);
    
    /**
     * 处理扫描完成
     */
    void onScanFinished();
    
    /**
     * 处理列表项选择变化
     */
    void onSelectionChanged();
    
    /**
     * 处理确定按钮点击
     */
    void onOkClicked();
    
    /**
     * 处理取消按钮点击
     */
    void onCancelClicked();
    
    /**
     * 处理刷新按钮点击
     */
    void onRefreshClicked();
    
    /**
     * 处理历史记录按钮点击
     */
    void onHistoryClicked();
    
    /**
     * 处理从历史记录选择Qt路径
     */
    void onHistoryItemSelected(const QString &qtPath);
    
private:
    /**
     * 初始化UI界面
     */
    void setupUI();
    
    /**
     * 连接信号和槽
     */
    void connectSignals();
    
    /**
     * 加载历史记录
     */
    void loadHistory();
    
    /**
     * 保存Qt路径到历史记录
     */
    void saveToHistory(const QString &qtPath);
    
    /**
     * 显示历史记录选择对话框
     */
    void showHistoryDialog();
    
    // UI组件
    QVBoxLayout *m_mainLayout;
    QHBoxLayout *m_buttonLayout;
    QLabel *m_titleLabel;
    QLabel *m_statusLabel;
    QListWidget *m_qtListWidget;
    QProgressBar *m_progressBar;
    QPushButton *m_okButton;
    QPushButton *m_cancelButton;
    QPushButton *m_refreshButton;
    QPushButton *m_historyButton;
    
    // 工作线程
    QtScanWorker *m_scanWorker;
    
    // 选中的Qt路径
    QString m_selectedQtPath;
    
    // 历史记录
    QStringList m_historyPaths;
};

#endif // QTSCANNER_H